#include "Point.h"
#include "Exception.h"
#include "Logger.h"

using namespace game_engine::utils;

///////////////////////////////////////////////////////////////////////////////
// Constructors and Destructors
///////////////////////////////////////////////////////////////////////////////

Point::Point(void) 
    : x(0.0f), y(0.0f) 
{ 
}

Point::Point(const FLOAT32 coordX, const FLOAT32 coordY)
    : x(coordX), y(coordY) 
{ 
}

Point::Point(const string &coords)
{
    string val(coords);
    size_t pos = val.find(",");

    // Separator not found
    if (pos == string::npos)
    {
        string msg = "Incorrect point format";
        Logger::ERR(GAMEENGINE_LOG, msg);
        throw IllegalArgumentException(msg);
    }

    x = atof((val.substr(0, pos)).c_str());
    y = atof((val.substr(pos+1)).c_str());
}

Point::~Point(void) 
{
}

///////////////////////////////////////////////////////////////////////////////
// Other public methods
///////////////////////////////////////////////////////////////////////////////

bool Point::operator==(const Point &other)
{
    return ((x == other.getX()) && (y == other.getY()));
}

bool Point::operator!=(const Point &other)
{
    return ((x != other.getX()) || (y != other.getY()));
}

//Point operator+(const Point &lhs, const Point &rhs)
//{
//    return Point(lhs.getX() + rhs.getX(), lhs.getY() + rhs.getY());
//}

//Point Point::operator+(const Point &rhs)
//{
//    return Point(x + rhs.getX(), y + rhs.getY());
//}

///////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////

const FLOAT32 Point::getX(void) const 
{ 
    return x; 
}

const FLOAT32 Point::getY(void) const 
{ 
    return y; 
}

///////////////////////////////////////////////////////////////////////////////
// Setters
///////////////////////////////////////////////////////////////////////////////

void Point::setX(const FLOAT32 coordX) 
{ 
    x = coordX; 
}

void Point::setY(const FLOAT32 coordY) 
{ 
    y = coordY; 
}
